﻿/*
 * Created by SharpDevelop.
 * User: CrOnO
 * Date: 20/11/2011
 * Time: 01:03 a.m.
 * 
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Collections.Generic;
using Business_Logic;
using Business_Entity;
using System.IO;

namespace PetSoft.GUI.Ventas
{
	/// <summary>
	/// Description of GUIEditarLineaPedidoVentaServicio.
	/// </summary>
	public partial class GUIEditarLineaPedidoVentaServicio : Form
	{
		BELineaPedidoServicio linea;
		BELineaPedidoServicio nuevo;
		List<BEEmpleado> empleados;
		Boolean cargoArchivo;/*0=no cargó/1=cargó*/
        Boolean yaDescargo;
		List<BEEstadoAtencion> estados;
		DateTime fecha;
		int hayProxcita;
		
		public GUIEditarLineaPedidoVentaServicio(BELineaPedidoServicio linea)
		{
			try
			{
				//
				// The InitializeComponent() call is required for Windows Forms designer support.
				//
				InitializeComponent();
				this.ExplorarBTN.Enabled = false;
				this.proxCitaDTP.MinDate = DateTime.Now;
				this.hayProxcita = 0; //0 = no, 1= si
				this.linea = linea;
				this.fechaDTP.MinDate = this.linea.Fecha;
				this.cargoArchivo = false;
                this.yaDescargo = false;
                this.openFileDialog1.FileName = "";	
                
                if (this.linea.Estado.Descripcion == "ATENDIDO")
                	this.ExplorarBTN.Enabled = true;
				//
				// TODO: Add constructor code after the InitializeComponent() call.
				//
				
				
				
				if ((this.linea.Estado.Descripcion == "EN PROCESO" )||( this.linea.Estado.Descripcion == "ATENDIDO")){
					this.fechaDTP.Enabled = false;
					this.empleadoCB.Enabled = false;
				}
				if (this.linea.Estado.IdEstado == 2)
					this.siguienteBTN.Enabled = false;
				
				if (this.linea.Mascota != null)
					this.mascotaTB.Text = this.linea.Mascota.Nombre;
				if (this.linea.Servicio != null)
				{
					this.servicioTB.Text = this.linea.Servicio.Descripcion;
					BLEmpleado blEmp = new BLEmpleado();
					List<BEEmpleado> listEmp = blEmp.buscarEmpleadoDadoServicio(this.linea.Servicio);
					if (listEmp != null)
	        		{
						this.empleados = listEmp;
	          			for(int i=0; i<listEmp.Count; i++)
	          				this.empleadoCB.Items.Add(listEmp[i].Nombre + " " + listEmp[i].ApPaterno + " " + listEmp[i].ApMaterno);
	          			if (this.linea.Empleado != null)
	          				this.empleadoCB.Text = this.linea.Empleado.Nombre + " " + this.linea.Empleado.ApPaterno + " " + this.linea.Empleado.ApMaterno;
	          			else 
	          				this.empleadoCB.Text = "<Seleccionar>";
	        		}
				}
				if (this.linea.Estado != null){
					this.estadoTB.Text = this.linea.Estado.Descripcion;
				}
				
				
				this.fechaDTP.Value = this.linea.Fecha;
						
			}
			catch (Exception ex)
			{
				MessageBox.Show("Error: "+ex,"Error");
			}
		}

		void HayProxCitaCheckedChanged(object sender, EventArgs e)
		{
			try
			{
				if (hayProxCita.Checked == false)
				{
					this.proxCitaDTP.Enabled = false;
				}
				else if (hayProxCita.Checked == true)
				{
					this.proxCitaDTP.Enabled = true;
				}
			}
			catch
			{
			}
		}
		
				
		void AceptarBTNClick(object sender, EventArgs e)
		{
			try
			{
				if ((fechaDTP.Value < DateTime.Now) && (fechaDTP.Value != this.fecha))
				{
					MessageBox.Show("La fecha de realización del servicio no puede ser menor a fecha actual " + DateTime.Now.ToShortDateString() + "o distinto a la fecha ya establecida " + this.fecha.ToShortDateString(), "Aviso", 
					                MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
				}
				else if ((this.empleadoCB.Text == "<Seleccionar>") || (this.empleadoCB.Text == "") || (this.estadoTB.Text == ""))
				{
					String mensaje = "Falta ingresar los siguientes datos: \r\n" + "\r\n";
	
					if ((this.empleadoCB.Text == "<Seleccionar>") || (this.empleadoCB.Text == ""))
						mensaje += "EMPLEADO" + "\r\n";
					if (this.estadoTB.Text == "")
						mensaje += "ESTADO" + "\r\n";
					
					mensaje += "\r\n";
			        MessageBox.Show(mensaje, "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
				}
				else
				{
					
					BLLineaPedidoVentaServicio bl = new BLLineaPedidoVentaServicio();
					
					nuevo = this.linea;
					nuevo.Empleado = empleados.Find(delegate(BEEmpleado emp)
					                                {
					                                	return (emp.Nombre + " " + emp.ApPaterno + " " + emp.ApMaterno) == this.empleadoCB.Text;
					                                });
					                                
					nuevo.Observaciones = this.obsTB.Text;
					nuevo.Fecha = this.fechaDTP.Value;
					
					
					if(this.hayProxCita.Checked == true)
					{
						nuevo.ProximaCita = this.proxCitaDTP.Value;
						this.hayProxcita = 1;
					} else 
						this.hayProxcita = 0;
														
					nuevo.Estado = (new BLEstadoAtencion()).getEstadoByDesc(this.estadoTB.Text);
					
					Boolean cambiaFecha = false;					
					int result1 = 1;
					
					if (nuevo.Fecha > this.linea.Fecha){
						cambiaFecha = true;
						result1 = (new BLLineaPedidoServicio()).verificaDisponibilidad(nuevo.Empleado.IdEmpleado, nuevo.Fecha, nuevo.Servicio.Codigo, nuevo.Mascota.Id);
						
					}
					
					Boolean proxCita = false;
					int result2 = 1;
					
					if (this.hayProxCita.Checked == true){
						proxCita = true;
						result2 = (new BLLineaPedidoServicio()).verificaDisponibilidad(nuevo.Empleado.IdEmpleado, nuevo.ProximaCita, nuevo.Servicio.Codigo, nuevo.Mascota.Id);
					}
					
					
					//verificar stock en tienda de los productos x insumo
					
					
					int result3=1;
					
					List <BEInsumoServicio> insumos = new List<BEInsumoServicio>();
					insumos = (new BLServicio()).SacaDetalleProducto(this.linea.Servicio);
					
					foreach (BEInsumoServicio insumo in insumos){
                	    BLProductoTienda prod = new BLProductoTienda();
                	    if ((prod.getStockActual(BLInfo.TiendaActual.Id, insumo.Producto.Codigo)<insumo.Cantidad)&&(nuevo.Estado.Descripcion == "REGISTRADO"))
                	    {
                	        Utils.MessageAviso("No existe suficiente "+ insumo.Producto.Nombre + " "+insumo.Cantidad+" \n,el stock actual es: "+prod.getStockActual(BLInfo.TiendaActual.Id,insumo.Producto.Codigo));
                	        result3=0;
                	        break;
                	    }
                    
                	}
               
					//si todos cumplen se editan
					
					int resultado = 0;
					
					Boolean enProceso = false;
					
					if (((cambiaFecha == true) && (result1 == 1)&& (result3 == 1)) || ((proxCita == true) && (result2 == 1) && (result3 == 1))|| (result3==1)) {
						
						
						nuevo.NomArchivo = this.linea.NomArchivo;
						nuevo.Archivo = this.linea.Archivo;
						
						
						//DISMINUIR STOCK
						
						if ((nuevo.Estado.Descripcion == "EN PROCESO")&& (result3==1)){
							enProceso = true;
               				foreach (BEInsumoServicio insumo in insumos){
                				       BLMovimiento mov=new BLMovimiento();
                				       BLProductoTienda prod = new BLProductoTienda();
                				       mov.nuevaSalidaProducto(BLInfo.TiendaActual.Id,insumo.Producto.Codigo,insumo.Cantidad);
                				       prod.actualizaStock(insumo.Producto.Codigo,BLInfo.TiendaActual.Id,prod.getStockActual(BLInfo.TiendaActual.Id,insumo.Producto.Codigo)-insumo.Cantidad);
               				}
							
						}
			
						//resultado = bl.modificarLineaPedidoVentaServicio(nuevo, hayProxcita);
						resultado = bl.modificarLineaPedidoVentaServicio2(nuevo, hayProxcita);
						
						BEAgendaActividad agenda = new BEAgendaActividad();
						
						agenda.IdEmpleado = nuevo.Empleado.IdEmpleado;
						agenda.Fecha = nuevo.Fecha;
						agenda.HoraInicio = nuevo.Fecha;
						agenda.HoraFin = nuevo.Fecha.AddHours(Convert.ToDouble(nuevo.Servicio.Duracion));
						agenda.Actividad = nuevo.Servicio.Descripcion + " - " + nuevo.Mascota.Nombre;
						
						int resultado2 = 1;
							
						if ( nuevo.Estado.Descripcion=="EN PROCESO")
							resultado2= (new BLAgendaActividad()).registrarActividad(agenda);
						
						
						
						if ((resultado == 1) && (resultado2 == 1))
						{	
							MessageBox.Show("Datos de la atencion modificados", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information);
							this.Close();
						}
						else
						{
							MessageBox.Show("Error en la modificación de datos","Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
						}
						this.Close();
					}
					else {
						if (cambiaFecha == true){
							
							if (result1 == 0){
							Utils.MessageAviso("La mascota y el empleado seleccionado no se encuentran disponibles para el "+Convert.ToString(nuevo.Fecha));
							} else if (result1 == 2){
								Utils.MessageAviso("El empleado seleccionado no se encuentra disponible para el "+ Convert.ToString(nuevo.Fecha));
							} else {
								Utils.MessageAviso("La mascota seleccionada no se encuentra disponible para el "+ Convert.ToString(nuevo.Fecha));
							}
						
						}
						if (proxCita == true){
							if (result2 == 0){
							Utils.MessageAviso("La mascota y el empleado seleccionado no se encuentran disponibles para el "+Convert.ToString(nuevo.ProximaCita));
							} else if (result2 == 2){
								Utils.MessageAviso("El empleado seleccionado no se encuentra disponible para el "+ Convert.ToString(nuevo.ProximaCita));
							} else {
								Utils.MessageAviso("La mascota seleccionada no se encuentra disponible para el "+ Convert.ToString(nuevo.ProximaCita));
							}
						}
						
					}
				}
				
								
			}
			catch (Exception ex)
			{
				MessageBox.Show("Error: "+ex,"Error");
			}
			
			
		}
		
		void GUIEditarLineaPedidoVentaServicioLoad(object sender, EventArgs e)
		{
			
	
		
		}
		void ExaminarBTNClick(object sender, EventArgs e)
		{
			
		}
		
		void CancelarBTNClick(object sender, EventArgs e)
		{
			try{
				this.Dispose();				
			}catch(Exception ex){
				Utils.MessageError("",ex);
			}
		}
		
		void SiguienteBTNClick(object sender, EventArgs e)
		{
			if(this.linea.Estado.Descripcion == "REGISTRADO"){
				this.estadoTB.Text = "EN PROCESO";
				this.siguienteBTN.Enabled = false;
			} else if (this.linea.Estado.Descripcion == "EN PROCESO"){
				this.estadoTB.Text = "ATENDIDO";
				this.siguienteBTN.Enabled = false;
				this.ExplorarBTN.Enabled = true;
			}
		}
		
		void FechaDTPValueChanged(object sender, EventArgs e)
		{
			if(this.fechaDTP.Value > this.linea.Fecha){
				this.siguienteBTN.Enabled = false;
				this.estadoTB.Text = "REGISTRADO";
				this.estadoTB.Enabled = false;
				//this.nuevo.Fecha = this.fechaDTP.Value;
			}
		}
		
		void ExplorarBTNClick(object sender, EventArgs e)
		{
			string rutaArchivo = "";
            this.openFileDialog1.InitialDirectory = "c:\\";
            this.openFileDialog1.Filter = "pdf files (*.pdf)|*.pdf|All files (*.*)|*.*";
            this.openFileDialog1.FilterIndex = 2;
            this.openFileDialog1.RestoreDirectory = true;
            this.openFileDialog1.FileName = "";
            //MessageBox.Show(openFileDialog1.FileName);  
            if (this.openFileDialog1.ShowDialog() == DialogResult.OK)  rutaArchivo = this.openFileDialog1.FileName;

            if (rutaArchivo != "")
            {
                FileStream flujoArch = new FileStream(rutaArchivo, FileMode.Open, FileAccess.Read);
                /*Si intento subir un archivo mayor al permitido, va a salir una error. Fija  varbinary(max) al campo del archivo, para que puedas
                         subir hasta 1 GB. En SqlServer o fijas el varbinary hasta un maximo de 8Kb aprox. o lo fijas en max. Creo que 
                         deberia validar por este codigo que el usuario no suba un archivo de mas de 2MB.*/
                if (flujoArch.Length <= 1024 * 1024 * 2)
                {
                    BinaryReader binarioRDR = new BinaryReader(flujoArch);
                    /*Esta es la estructura final en el programa donde se guarda el archivo.*/
                    byte[] archivo = binarioRDR.ReadBytes((int)(flujoArch.Length));

                    /*Seria bueno que el nombre del archivo siguiese un  standar de nombramiento y creo que deberia ser definido al momento
                     de crear el archivo con alguna herramienta. Por ejemplo se podria decir que vaya primero el idCliente, luego el idPedidVenta, y asi*/
                    string[] arregloCadenas = rutaArchivo.Split(new char[] { '\\' });
                    string nomArch = arregloCadenas[arregloCadenas.Length - 1];
                    this.linea.Archivo = archivo;
                    this.linea.NomArchivo = nomArch;
                    this.cargoArchivo = true;
                    //MessageBox.Show(nomArch);
                    flujoArch.Close();
                    binarioRDR.Close();
                    this.rutaArchTB.Text = rutaArchivo;
                }
                else MessageBox.Show("No se pudo cargar el archivo. Se excedio el límite de 2MB para el tamañao de archivo", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            //else MessageBox.Show("No ha seleccionado ningun archivo para subir.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
		}
		
		void LimpiarBTNClick(object sender, EventArgs e)
		{
			this.rutaArchTB.Text = "";
            this.linea.Archivo = null;
            this.linea.NomArchivo = "";
            this.cargoArchivo = false;
		}
		
		void DescargarBTNClick(object sender, EventArgs e)
		{
			FileStream flujoArch;
            string  mensajeError = "";
            int error = 0;
            //this.lineaPedidoServicioBE.Id = 8; //prueba
            if (this.yaDescargo == false)
            {
                
                BLLineaPedidoServicio bl = new BLLineaPedidoServicio();
                bl.descargarArchivoLineaServicio(this.linea, ref error, ref mensajeError);
                
                this.yaDescargo = true;
            }
            if (error == 0 && this.yaDescargo == true)
            {
                SaveFileDialog saveFileDialog1 = new SaveFileDialog();
                saveFileDialog1.InitialDirectory = "c:\\";
                // saveFileDialog1.ShowDialog();
                try
                {
                    if (saveFileDialog1.ShowDialog() == DialogResult.OK)
                    {

                        /*En este modo, arroja una excepcion manifiesta luego en una ventana de pregunta si el archivo ya existe. El in
                            conveniente es que sale en ingles.*/
                        /*Si quieres podrias guardarlo con el mismo nombre de la BD, que esta en la variable nomArch*/
                        flujoArch = new FileStream(saveFileDialog1.FileName, FileMode.CreateNew);
                        flujoArch.Write(linea.Archivo, 0, linea.Archivo.Length);
                        flujoArch.Close();
                    }
                }

                catch (Exception ex)
                {
                    //MessageBox.Show("El archivo: " + this.saveFileDialog1.FileName + " ya existe. Desea reemplazarlo?","Pregunta", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                    //MessageBox.Show(ex.ToString());
                }
            }
            else MessageBox.Show("Error " + error + ". " + mensajeError, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
		}
	}
}
